package com.example.baiduai.utils;


import lombok.SneakyThrows;
import org.apache.commons.lang3.time.DateUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class TimeUtils {
	
	public static SimpleDateFormat format_ymd_hms=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	public static SimpleDateFormat format_ymd_hm=new SimpleDateFormat("yyyy-MM-dd HH:mm");
	public static SimpleDateFormat format_ymd=new SimpleDateFormat("yyyy-MM-dd");



	/**
	 * 得到当前时间  yyyy-MM-dd hh:mm:ss
	 * @return
	 */
	public static String getCurrentTime_ymd_hms(){
		return format_ymd_hms.format(new Date()).toString().trim();
	}
	
	/**
	 * 得到当前时间  yyyy-MM-dd 
	 * @return
	 */
	public static String getCurrentTime_ymd(){
		return format_ymd.format(new Date()).toString().trim();
	}


    /**
     * 现在的时间
     * @return
     */
	public static Date nowDate(){

	    return new Date();
    }



	/**
	 *@description 得到当前时间的long 格林时间
	 *@params
	 *@return  
	 *@author  helei
	 *@create_time  2018-10-12
	 *@other
	 */
	public static long getCurrentTime_long(){
		return new Date().getTime();
	}

	/**
	 * 将时间转成指定格式
	 */
	public static String to_ymd_hms(Date date){
		 String result="";
		try{
			result= format_ymd_hms.format(date);
		}catch(Exception ex){
			return "";
		}
		 return result;
	}

	/**
	 * 将时间转成指定格式
	 */
	public static String to_ymd_hm(Date date){
		String result="";
		try{
			result= format_ymd_hm.format(date);
		}catch(Exception ex){
			return "";
		}
		return result;
	}

	/**
	 * 将时间转成指定格式
	 */
	public static String to_ymd(Date date){
		String result="";
		try{
			result= format_ymd.format(date);
		}catch(Exception ex){
			return "";
		}
		return result;
	}


	/**
	 * 获取截止到指定日期所有周一到周天的日期
	 */
	public static Map<String,List<String>> allDateForWeek(Date currentDate,String endDate){
		Calendar calendar =Calendar.getInstance(); //当前日期
		calendar.setTime(currentDate);//设置起始日期，在这个计算中，包含了当天，若想不包含，请在currentDate，传入前，先往后推算一天
		Calendar cend =Calendar.getInstance();
		try {
			cend.setTime(DateUtils.parseDate(endDate,"yyyy-MM-dd"));
			cend.add(Calendar.DAY_OF_MONTH, 1);
		} catch (ParseException e) {
			System.out.println("结束日期-日期转换错误！");
		}
		int currentd=calendar.get(Calendar.DATE);
		calendar.set(Calendar.DATE,currentd-1);

		int currentDayOfWeek=calendar.get(Calendar.DAY_OF_WEEK)-1;
		Map<String,List<String>> map=new HashMap<>();

		for(int i=1;i<8;i++) {
			List<String> dates=new ArrayList<>();
			System.out.println("周"+i);
			Calendar d = (Calendar) calendar.clone();
			if(currentDayOfWeek<i){//如果循环周大于当前的周
				d.add(Calendar.DAY_OF_MONTH, i - currentDayOfWeek);
			}else if(currentDayOfWeek>=i) {
				d.add(Calendar.DAY_OF_MONTH, 7 + i - currentDayOfWeek);
			}
			//向后
			for (; d.before(cend) && d.after(calendar); d.add(Calendar.DAY_OF_YEAR, 7)) {
				dates.add(d.get(Calendar.YEAR)+"-"+handlerNum(1+d.get(Calendar.MONTH))+"-"+handlerNum(d.get(Calendar.DATE)));
			}
			map.put(""+i,dates);
		}
		return map;
	}

	/**
	 * 处理数字
	 * @return
	 */
	private static String handlerNum(int num){
		if(num>9){
			return Integer.toString(num);
		}else{
			return "0"+num;
		}
	}

	/**
	 * 获取指定日期是周几
	 * @return
	 */
	public static String dateForWeek(String date){
		try {
			Date parse = DateUtils.parseDate(date,"yyyy-MM-dd");
			Calendar calendar =Calendar.getInstance(); //当前日期
			calendar.setTime(parse);
			int currentDayOfWeek=calendar.get(Calendar.DAY_OF_WEEK)-1;
			return currentDayOfWeek+"";
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}



	public static double dateDiff(Date startTime, Date endTime) throws Exception {
		//按照传入的格式生成一个simpledateformate对象
		long nd = 1000*24*60*60;//一天的毫秒数
		long nh = 1000*60*60;//一小时的毫秒数
		long nm = 1000*60;//一分钟的毫秒数
		long diff;
		//获得两个时间的毫秒时间差异
		diff = endTime.getTime() - startTime.getTime();
		long day = diff/nd;//计算差多少天
		long hour = diff%nd/nh;//计算差多少小时
		long min = diff%nd%nh/nm;//计算差多少分钟
		return day*24+hour+(min/60d) ;
	}




    /**
     * 获取 时间 格式 （yyyy-MM-dd HH:mm）
     *
     * @param date
     * @return
     */
    @SneakyThrows
    public static Date getDateYYMMDDHHSS(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        return  sdf.parse(date);
    }




    /**
     * 获取 时间 格式 （yyyy-MM-dd ）
     *
     * @param date
     * @return
     */
    @SneakyThrows
    public static Date getDateYYMMDD(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return  sdf.parse(date);
    }



    /**
     * 获取 时间 格式 （yyyy-MM-dd ）
     *
     * @param date
     * @return
     */
    @SneakyThrows
    public static Date getDateHHss(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        return  sdf.parse(date);
    }



    /**
     * 计算两个时间相差多少小时 (小于 60分钟 返回0)
     * @param creatrTime
     * @param endTime
     * @return
     */
    @SneakyThrows
    public static int getTimeDifference(Date creatrTime, Date endTime){

        //Date creatrDate = format_ymd_hms.parse(creatrTime);
        long nh = 1000*60*60;//一小时的毫秒数
        //获得两个时间的毫秒时间差异
        long diff = endTime.getTime() - creatrTime.getTime();
        return new Long( diff / nh).intValue();
    }
    /**
     * 计算两个时间相差多少分钟 (小于 60分钟 返回0)
     * @param creatrTime
     * @param endTime
     * @return
     */
    @SneakyThrows
    public static int getTimeMin(Date creatrTime, Date endTime){

        //Date creatrDate = format_ymd_hms.parse(creatrTime);
        long nh = 1000*60;//分钟的毫秒数
        //获得两个时间的毫秒时间差异
        long diff = endTime.getTime() - creatrTime.getTime();
        return new Long( diff / nh).intValue();
    }


    /**
     * 计算两个时间相差多少分钟
     * @param creatrTime
     * @param endTime
     * @return
     */
    @SneakyThrows
    public static int getTimeStrDifference(String creatrTime, Date endTime){

        return  getTimeMin(format_ymd_hm.parse(creatrTime), endTime);
    }

    /**
     * 计算两个时间相差多少分钟
     * @param creatrTime
     * @param endTime
     * @return
     */
    @SneakyThrows
    public static int getTimeStrDifferenceYMD(String creatrTime, Date endTime){

        return  getTimeMin(format_ymd.parse(creatrTime), endTime);
    }




    /**
     * 计算两个时间相差多少 小时
     * @param creatrTime
     * @param endTime
     * @return
     */
    @SneakyThrows
    public static int getTimeStr(String creatrTime, Date endTime){

        return  getTimeDifference(format_ymd_hm.parse(creatrTime), endTime);
    }

















}
